/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.halos.common.plugins;

import com.halos.interfaz.vista.IPanel;
import com.halos.interfaz.vista.IPlugin;
import com.halos.vista.FormPrincipal;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;

/**
 *
 * @author josue
 */
public class IntegraPlugins {


    public static JTree getMenuOptions() {

        Object[] opciones = getPlugins();
        
        DefaultMutableTreeNode root = new DefaultMutableTreeNode("Halos");
        DefaultTreeModel modelo = new DefaultTreeModel(root);
        modelo.setRoot(root);
        DefaultMutableTreeNode modulo=null;
        DefaultMutableTreeNode opcionItem;
        
        List<String> listaModulos;
        if (opciones.length > 0) {
            listaModulos = new ArrayList<>();
            for (int i = 0; i < opciones.length; i++) {
                String[] dir = ((IPanel)opciones[i]).getClass().getPackage().getName().split("\\.");
                if (!listaModulos.contains(dir[dir.length-1])) {
                    listaModulos.add(dir[dir.length-1]);   
                    modulo = new DefaultMutableTreeNode(listaModulos.get(listaModulos.size()-1));
                    opcionItem = new DefaultMutableTreeNode((IPanel) opciones[i]);
                    modulo.add(opcionItem);
                    root.add(modulo);
                } else {
                    opcionItem = new DefaultMutableTreeNode((IPanel) opciones[i]);
                    modulo.add(opcionItem);
                }
            }
        }
        
        final JTree menuOpciones = new JTree(modelo);

        MouseListener ml = new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                int selRow = menuOpciones.getRowForLocation(e.getX(), e.getY());
                TreePath selPath = menuOpciones.getPathForLocation(e.getX(), e.getY());
                if (selRow != -1) {
                    if (e.getClickCount() == 1) {
                        //sin usar
                    } else if (e.getClickCount() == 2) {
                        if (!((DefaultMutableTreeNode) selPath.getLastPathComponent()).isRoot()
                                && ((DefaultMutableTreeNode) selPath.getLastPathComponent()).getLevel() != 1) {
                            FormPrincipal fp = FormPrincipal.getInstanceFormPrincipal();
                            fp.atentoAlCambio((IPanel) ((DefaultMutableTreeNode) selPath.getLastPathComponent()).getUserObject());
                        }
                    }
                }
            }
        };
        menuOpciones.addMouseListener(ml);
        return menuOpciones;

    }

    private static Object[] getPlugins() {
        System.out.println("-------------------------------");

        //se cargan los jars del directorio "plugins" al classpath
        boolean cargados = CargadorPlugins.cargarPlugins();
        Object[] avisadores = null;
        if (cargados) {
            try {
                //obtiene una instancia de cada plugin IPluginMensaje encontrado
                avisadores = CargadorPlugins.getPlugins(IPlugin.class);

                if (avisadores.length > 0) {
                    for (Object a : avisadores) {
                        //por cada plugin muestra la clase y el mensaje que devuelve
                        System.out.println("Plugin: \t" + a.getClass().getCanonicalName());
                        System.out.println("Mensaje:\t" + ((IPlugin) a).getNombreFuncionalidad());
                        System.out.println();
                    }
                } else {
                    System.out.println("No se Encontraron Plugins");
                }
            } catch (Exception ex) {
                System.err.println("Excepcion: " + ex.getMessage());
                ex.printStackTrace();
            }
        } else {
            System.out.println("Plugins No Cargados");
        }

        System.out.println("-------------------------------");

        return avisadores;

    }

    public static void getPlugins2() {
        System.out.println("-------------------------------");

        //se cargan los jars del directorio "plugins" al classpath
        boolean cargados = CargadorPlugins.cargarPlugins();

        if (cargados) {
            try {
                //obtiene una instancia de cada plugin IPluginMensaje encontrado
                Object[] avisadores = CargadorPlugins.getPlugins(IPlugin.class);

                if (avisadores.length > 0) {
                    for (Object a : avisadores) {
                        //por cada plugin muestra la clase y el mensaje que devuelve
                        System.out.println("Plugin: \t" + a.getClass().getCanonicalName());
                        System.out.println("Mensaje:\t" + ((IPlugin) a).getNombreFuncionalidad());
                        System.out.println();
                    }
                } else {
                    System.out.println("No se Encontraron Plugins");
                }
            } catch (Exception ex) {
                System.err.println("Excepcion: " + ex.getMessage());
                ex.printStackTrace();
            }
        } else {
            System.out.println("Plugins No Cargados");
        }

        System.out.println("-------------------------------");

    }
//    public static void getPlugins(){
//    System.out.println("-------------------------------");
// 
//        //se cargan los jars del directorio "plugins" al classpath
//        boolean cargados = CargadorPlugins.cargarPlugins();
// 
//        if (cargados) {
//            try {
//                //obtiene una instancia de cada plugin IPluginMensaje encontrado
//                IPanel[] avisadores = CargadorPlugins.getPlugins();
// 
//                if (avisadores.length > 0) {
//                    for (IPanel a : avisadores) {
//                        //por cada plugin muestra la clase y el mensaje que devuelve
//                        System.out.println("Plugin: \t" + a.getClass().getCanonicalName());
//                        System.out.println("Mensaje:\t" + a.getNombreFuncionalidad());
//                        System.out.println();
//                    }
//                } else {
//                    System.out.println("No se Encontraron Plugins");
//                }
//            } catch (Exception ex) {
//                System.err.println("Excepcion: " + ex.getMessage());
//                ex.printStackTrace();
//            }
//        } else {
//            System.out.println("Plugins No Cargados");
//        }
// 
//        System.out.println("-------------------------------");
//
//    }
}
